package validators

import (
	"errors"
	"fmt"
	"regexp"
	"strconv"
	"strings"
	"time"
	"unicode/utf8"

	"github.com/thedevsaddam/govalidator"
)

// 此方法会在初始化时执行，注册自定义表单验证规则
func init() {

	// max_cn:8 中文长度设定不超过 8
	govalidator.AddCustomRule("max_cn", func(field string, rule string, message string, value interface{}) error {
		valLength := utf8.RuneCountInString(value.(string))
		l, _ := strconv.Atoi(strings.TrimPrefix(rule, "max_cn:"))
		if valLength > l {
			// 如果有自定义错误消息的话，使用自定义消息
			if message != "" {
				return errors.New(message)
			}
			return fmt.Errorf("长度不能超过 %d 个字", l)
		}
		return nil
	})

	// min_cn:2 中文长度设定不小于 2
	govalidator.AddCustomRule("min_cn", func(field string, rule string, message string, value interface{}) error {
		valLength := utf8.RuneCountInString(value.(string))
		l, _ := strconv.Atoi(strings.TrimPrefix(rule, "min_cn:"))
		if valLength < l {
			// 如果有自定义错误消息的话，使用自定义消息
			if message != "" {
				return errors.New(message)
			}
			return fmt.Errorf("长度需大于 %d 个字", l)
		}
		return nil
	})

	govalidator.AddCustomRule("phone", func(field string, rule string, message string, value interface{}) error {
		reg := regexp.MustCompile(`^1[3-9]\d{9}$`)
		if !reg.MatchString(value.(string)) {
			if message != "" {
				return errors.New(message)
			}
			return fmt.Errorf("手机号格式错误")
		}
		return nil

	})

	govalidator.AddCustomRule("datetime", func(field string, rule string, message string, value interface{}) error {

		// 定义日期格式
		layout := "2006-01-02 15:04:05"
		// 使用 time.Parse() 函数解析字符串
		_, err := time.Parse(layout, value.(string))
		if err != nil {
			if message != "" {
				return errors.New(message)
			}
			return fmt.Errorf("日期格式错误")
		}
		return nil

	})
}
